Return 문
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
`return` 문은 다양한 프로그래밍 언어에서 함수 또는 서브루틴의 실행을 종료하고 호출한 곳으로 제어 흐름을 반환하는 데 사용되는 구문이다. 언어별로 `return` 문의 형태와 값 반환 방식에 차이가 있으며, 일부 언어에서는 값을 생략할 경우 반환되는 값이 다르다. C, C++, Java 등에서는 특정 조건에서 `return` 문 사용이 제한되기도 하며, 함수형 언어에서는 마지막 식의 평가 결과가 자동으로 반환되는 경우도 있다. 또한, `return` 문 외에 코루틴을 일시 중단시키는 `yield` 문도 존재한다.
더 읽어볼만한 페이지
- 함수 (프로그래밍) - 사용자 정의 함수
사용자 정의 함수는 프로그래밍 언어와 데이터베이스 시스템에서 사용자가 직접 정의하여 재사용할 수 있는 코드 블록이다. - 함수 (프로그래밍) - 코루틴
코루틴은 실행을 멈췄다가 다시 시작할 수 있는 서브루틴의 특별한 형태로, 로컬 데이터를 보존하며 다양한 방식으로 구현되고 여러 프로그래밍 상황에서 유용하게 쓰인다. - 제어 흐름 - 프로그램 카운터
프로그램 카운터는 CPU 내에서 다음에 실행될 명령어의 주소를 저장하는 레지스터로, 명령어 사이클의 fetch 단계에서 사용되어 명령어를 가져오고 실행 후 갱신되며, CPU 성능 향상 기술과 현대 프로그래밍 모델에 영향을 미친다. - 제어 흐름 - 예외 처리
예외 처리는 프로그램 실행 중 예외 발생 시 정상적인 실행 흐름을 유지하거나 안전하게 종료하기 위한 메커니즘으로, 많은 프로그래밍 언어에서 제공하며 예외 안전성을 목표로 한다.
Return 문 | |
---|---|
개요 | |
종류 | 통제 흐름 문 |
의미 | 현재 함수의 실행을 종료 |
효과 | 함수 호출자에게 제어를 반환 |
반환 값 | 선택 사항 |
문법 | |
일반 형식 | 'return 표현식;' |
표현식 | 함수가 값을 반환하는 경우, 반환되는 값을 지정 |
반환 값 생략 | 함수가 값을 반환하지 않는 경우, 생략 가능 |
동작 | |
함수 종료 | return 문은 현재 실행 중인 함수를 즉시 종료 |
호출자에게 반환 | 함수의 제어를 호출자에게 반환 |
반환 값 전달 | 함수가 값을 반환하는 경우, 지정된 값을 호출자에게 전달 |
예시 (C++) | |
반환 값 있는 함수 | 'int add(int a, int b) { return a + b; }' |
반환 값 없는 함수 (void) | 'void printMessage(const std::string& message) { std::cout << message << std::endl; return; // 선택적 return 문 }' |
추가 정보 | |
암시적 반환 | 일부 언어에서는 함수가 명시적인 return 문 없이도 마지막 표현식의 값을 반환할 수 있음 |
여러 개의 return 문 | 함수 내에 여러 개의 return 문이 있을 수 있으며, 조건에 따라 다른 값을 반환하거나 다른 시점에 함수를 종료할 수 있음 |
반환 값 자료형 | 함수 정의 시 명시된 반환 값 자료형과 return 문에서 반환하는 값의 자료형이 일치해야 함 (또는 암시적 형변환이 가능해야 함) |
2. 문법
`return` 문은 다양한 프로그래밍 언어에서 함수나 서브루틴의 실행을 종료하고 호출한 곳으로 제어를 돌려주면서, 선택적으로 특정 값을 반환하는 데 사용되는 기본적인 제어문이다. 구현 방식은 언어마다 조금씩 다르다.
다수의 언어, 예를 들어 C, C++, 자바, C#, 자바스크립트 등에서는 `return 표현식;` 형태를 사용하여 명시적으로 값을 반환한다. 값을 반환하지 않는 함수(void 함수)에서는 `return;`만 사용하거나 문을 생략하여 함수의 끝에서 암묵적으로 반환하기도 한다.[10][11]
표현식 지향 프로그래밍 언어인 Lisp, Perl, 루비 등에서는 `return` 문을 생략하면 함수 내 마지막으로 평가된 표현식의 결과가 자동으로 반환 값이 되기도 한다. 명시적인 `return` 없이 함수가 종료될 때 반환되는 기본값은 언어마다 다른데, 예를 들어 파이썬은 `None`[2]을, 자바스크립트는 `undefined`를 반환한다.
파스칼처럼 명시적인 `return` 문이 없는 언어도 있다. 이 경우 함수 이름과 동일한 변수에 값을 할당하는 방식으로 반환 값을 지정한다.[3] 포트란도 유사하게 함수 이름에 값을 할당하지만, 값을 지정하지 않는 `RETURN` 문도 별도로 존재한다.[3][5][6]
어셈블리어에서는 `ret` (x86 어셈블리) 또는 `RTS` (MOS 6502) 같은 특정 명령어를 사용한다.
다음 표는 여러 프로그래밍 언어에서의 `return` 문(또는 유사 기능)의 구문 예시와 특징을 요약한 것이다.
언어 | Return 문 구문 예시 | 값 생략 시 반환 (또는 특징) |
---|---|---|
에이다, C, C++, 자바, PHP, C#, 자바스크립트, D | C[10]/C++[11]: (값을 반환해야 할 때 생략 시) 정의되지 않은 동작 PHP[12]: `NULL` JavaScript[13]: `undefined` Java/C#: (값을 반환해야 할 때 생략 시) 컴파일 오류 | |
Bash[44] | 마지막 명령의 종료 상태 (0-255 정수)[9] | |
BASIC (전통적) | `GOSUB`으로 호출된 서브루틴에서 복귀 | |
Lisp | 마지막 표현식의 값 | |
Perl, 루비 | 마지막 표현식의 값 (생략 시) | |
파스칼 | (명시적 return 문 없음) | 함수명 변수에 값 할당. 일부 버전은 `Exit(value)` 사용.[4] |
파이썬 | `None`[2] | |
스몰토크 | (해당 없음) | |
Visual Basic .NET | (값을 반환하는 함수/속성에서 생략 시 컴파일 오류) | |
Windows PowerShell | 명시적 return 외에도 캡처되지 않은 표현식 결과 자동 반환 | |
x86 어셈블리 | 서브루틴 복귀 (값 전달은 관례 따름, 예: `eax` 레지스터) |
많은 운영 체제는 프로그램이 종료될 때 종료 상태라는 결과 값을 반환하는 기능을 제공한다. 이 값은 주로 프로그램 실행의 성공 또는 실패 여부를 나타내며, 프로그램 내에서는 보통 `Exit` 시스템 호출을 통해 전달된다.
2. 1. C/C++
C 및 C++에서 `return` 문은 함수를 실행한 결과나 해당 처리의 성공 여부 등을 호출 측에 전달하는 동시에 함수를 종료하고 호출 측으로 제어를 반환하는 역할을 하는 문장이다. `return` 문을 통해 함수의 호출 측에 데이터를 전달하는 것을 '''값을 반환한다'''라고 한다.`return` 문에 의해 반환되는 값의 형은 함수의 정의 시나 프로토타입 선언 시에 지정한다. 예를 들어,
int f(void);
라는 선언은 함수 `f()`가 `int` 형의 값을 반환함을 나타낸다.
void g(void);
라는 선언은 함수 `g()`가 값을 반환하지 않음을 나타낸다. 이 void는 형식적인 형이며, 메모리 상의 객체로 실체화할 수 없다.
`return` 문의 형식은 다음과 같다.
return 식;
또는
return ;
`return` 문에 식이 수반되는 경우, 해당 표현식의 평가 결과가 함수의 반환값이 된다. C/C++에서 문법적으로는 `return` 문을 생략할 수 있지만, 의미 분석 단계에서 다음과 같은 규칙이 적용된다.
- C99 표준에 따르면, 식을 갖는 `return` 문은 반환값 형이 `void`인 함수 내에서 나타나서는 안 되며, 식을 갖지 않는 `return` 문은 반환값 형이 `void`인 함수 내에서만 나타나야 한다.[25]
- C++에서는 함수의 끝에 도달하여 제어가 넘어가는 것은 값이 없는 `return;` 문이 있는 경우와 동일하며, 값을 반환해야 하는 함수에서 이러한 상황이 발생하면 정의되지 않은 동작을 일으킨다.[26] 따라서, 이 규칙을 위반하는 코드에 대해 컴파일러는 통상적으로 경고를 발생시킨다.
`return` 문의 식이 함수의 반환값 형과 다른 경우, 해당 값은 함수의 반환값 형을 갖는 객체에 대한 대입과 동일한 규칙으로 암묵적으로 형 변환된다.[27] C++의 경우, `return` 문은 임시 객체의 구축과 복사를 수반할 수 있다.[26]
`return` 문을 만나지 않은 채 함수의 끝까지 프로그램이 실행된 경우, 그곳에 식을 생략한 `return;`이 기술된 것으로 간주된다. 단, C99와 C++98에서는 main 함수에 한해, 해당 `main` 함수의 반환값 형이 `int`이면 `return 0;`이 기술된 것으로 간주된다.[30][31] C++에서는 규격상 `main` 함수의 반환값은 `int`여야 하지만[28], C99 이후의 C에서는 다른 구현 정의 방식도 인정된다.[29]
반환값 형이 `void`인 함수에서 식을 갖는 `return` 문이 나타나는 것은 C에서는 허용되지 않지만, C++98에서는 `void` 형의 식을 갖는 경우에 한해 허용된다.[32] 이는 템플릿의 범용성을 높이는 데 기여했다.
함수 내부에서 예외를 던지거나, `std::exit()` 함수 또는 `std::abort()` 함수를 호출하여 프로그램을 종료하는 등의 이유로, `return` 문을 결코 실행하지 않는 함수가 정의될 수 있다. C++11에서는 이러한 함수임을 명시적으로 나타내기 위해 `noreturn` 속성이 추가되었다.[33] 호출하는 함수는 이 정보를 활용하여 최적화를 수행하거나 불필요한 경고를 피할 수 있다.
C11에서는 유사 기능으로 `_Noreturn` 함수 지정자가 추가되었으나, C23에서는 C++과 동일한 `noreturn` 속성 구문이 추가되어 `_Noreturn`은 더 이상 사용되지 않을 예정이다.[34]
C++의 람다식에서는 값을 반환하는 경우 `return` 문을 생략할 수 없다.
auto f = [](double x) -> double { return x * x; };
람다식의 반환값 형 지정은 생략할 수도 있으며, 람다식 안에 `return` 문이 하나도 없는 경우에는 `void`로 간주된다. 람다식 안에 `return` 문이 있는 경우, 해당 `return` 문의 식으로부터 반환값 형이 추론되지만, 여러 개의 `return` 문이 있고 반환값 형이 유일하게 정해지지 않는 경우에는 컴파일 오류가 발생한다.
2. 2. Java
자바에서 `return` 문은 실행 중인 메서드의 실행을 종료하고 호출한 곳으로 제어를 돌려주는 역할을 한다. 값을 반환하는 경우, 메서드 선언 시 반환될 값의 데이터 타입을 명시해야 한다. C 언어와 마찬가지로 다음과 같은 두 가지 구문 형식을 사용한다.- 구문 1: 값을 반환하지 않고 메서드 실행만 종료할 때 사용한다.
:
return;
- 구문 2: 특정 값을 반환하며 메서드 실행을 종료할 때 사용한다. '식' 부분에는 반환할 값이 들어간다.
:
return 식;
메서드가 `void`로 선언되어 반환값이 없거나 생성자, 람다 표현식처럼 값을 반환하지 않는 경우[35], 값을 지정하지 않는 구문 1(`return;`)을 사용한다. 이 `return;` 문은 생략 가능하며, 생략 시 메서드의 마지막 코드까지 실행된 후 자동으로 호출 지점으로 제어가 넘어간다. 반대로, 특정 데이터 타입의 값을 반환하도록 선언된 메서드는 반드시 구문 2(`return 식;`)를 사용하여 해당 타입의 값을 명시적으로 반환해야 한다.
2. 3. BASIC
BASIC 또는 Visual Basic 버전 6까지에서 `return` 문은 `gosub` 명령으로 호출된 서브루틴에서 원래의 메인 루틴으로 돌아갈 때 사용된다. 프로그램은 `gosub`이 호출된 원래의 행 번호나 구문 위치를 기억하고 있다가, 실행 중 `return` 문을 만나면 기억된 위치의 다음 명령이나 행 번호부터 실행을 이어간다.BASIC의 `return` 문은 일반적으로 `RETURN` 키워드를 사용하며, 행 번호 지정 여부에 따라 두 가지 방식으로 사용될 수 있다.
- 행 번호 없는 `return`
가장 기본적인 형태로, 가장 최근에 실행된 `gosub` 명령의 다음 행으로 프로그램 제어를 되돌린다.
:```basic
RETURN
```
:예시
:```basic
10 a=1: GOSUB 100
20 a=2: GOSUB 100
30 a=3: GOSUB 100
40 a=4: GOSUB 100
50 END
100 '서브루틴 시작
110 PRINT a
120 RETURN '호출한 곳 다음 행으로 돌아감
```
위 예시에서 10, 20, 30, 40행은 각각 100행에서 시작하는 서브루틴을 호출한다. 서브루틴 내 110행에서 변수 `a`의 값을 출력한 후, 120행의 `RETURN` 문을 만나면 원래 호출했던 행의 다음 행(각각 20, 30, 40, 50행)으로 돌아가 실행을 계속한다.
- 행 번호 있는 `return`
일부 BASIC 구현에서는 `return` 문에 특정 행 번호를 지정하여, `gosub` 호출 지점으로 돌아가는 대신 지정된 행 번호로 직접 이동하게 할 수 있다. 이는 일반적인 서브루틴 복귀 메커니즘에서 벗어나는 흐름 제어 방식이다.
:```basic
RETURN 행 번호
```
:예시
:```basic
10 a=1: GOSUB 100
20 a=2: GOSUB 100
30 a=3: GOSUB 100
40 a=4: GOSUB 100
50 END
100 '서브루틴 시작
110 PRINT a
120 IF a < 3 THEN RETURN 'a가 3보다 작으면 일반 RETURN
130 IF a >= 3 THEN RETURN 150 'a가 3 이상이면 150행으로 이동
150 '서브루틴 탈출 지점
160 PRINT "end"
170 END
```
위 예시에서는 변수 `a`의 값에 따라 분기한다. `a`가 1 또는 2일 때는 120행의 `RETURN`에 의해 정상적으로 호출 지점 다음 행으로 돌아간다. 하지만 `a`가 3 또는 4일 때(각각 30행과 40행에서 호출된 경우), 130행의 `RETURN 150` 문이 실행되어 프로그램 흐름이 150행으로 직접 이동한다. 이 경우, `gosub` 호출 시 저장되었던 복귀 주소 정보가 스택에서 제거되므로, 이후 다른 `RETURN` 문을 만나더라도 원래 호출 지점(이 경우 40행 또는 50행)으로 돌아가지 않으며, 예상치 못한 동작이나 오류를 발생시킬 수 있다.
또한, 많은 BASIC 구현에서는 `gosub`-`return` 구조를 중첩하여 사용할 수 있다. 즉, 하나의 서브루틴 안에서 다른 서브루틴을 `gosub`으로 호출하는 것이 가능하다. 이 경우 `return` 문은 호출된 순서의 역순으로 처리되어 가장 안쪽 서브루틴부터 빠져나온다. 서브루틴이 자기 자신을 `gosub`으로 호출하는 재귀 호출도 문법적으로 가능하지만, 스택 관리의 한계로 인해 버그나 스택 오버플로를 일으키기 쉬우므로 주의해서 사용해야 한다.
2. 4. 함수형 언어 (F#, Rust, Swift)
함수형 프로그래밍 언어에서는 함수 내에서 마지막으로 평가되는 식이 반환값이 된다. 또한, `if`-`else`와 같은 제어 구조는 문이 아닌 식이므로 값을 반환한다. 따라서 절차적 언어에서 `return 식`과 같은 구문을 사용할 필요가 없다. 하지만 Haskell의 `return` 함수나, F#의 계산식에서 'return' 키워드[36]처럼 다른 목적으로 return이라는 개념이 사용되는 경우가 있다.// F#
let f x =
if x > 0.0 then
2.0 * x
else
0.0
Rust와 같이 'return' 식[37] (마지막에 세미콜론 `;`을 붙여 return 문이 됨)을 지원하지만, 생략하여 함수형 언어처럼 쓸 수 있는 언어도 존재한다.
fn f(x: f64) -> f64 {
if x > 0.0 {
2.0 * x
}
else {
0.0
}
}
Swift 5.1 이후 버전에서는 단일 식으로 구성된 함수에서 'return'을 생략하는 방식을 지원한다[38].
func f(_ x: Double) -> Double {
x > 0.0 ? 2.0 * x : 0.0
}
Swift 5.9 이후에는 if문 외에도 if 식[39]도 지원하게 되어, 다음과 같은 작성도 가능해졌다.
func f(_ x: Double) -> Double {
if x > 0.0 {
2.0 * x
}
else {
0.0
}
}
2. 5. Pascal
파스칼 (프로그래밍 언어)에는 `return` 문이 없다. 함수나 프로시저는 마지막 문에 도달하면 자동으로 호출한 곳으로 돌아간다. 함수의 반환 값은 함수와 동일한 이름을 가진 식별자에 값을 할당하는 방식으로 지정한다.ISO 표준 파스칼에서는 `return` 문에 직접 해당하는 문법이 없으며, 가장 간단한 대체 방법은 goto 문을 사용하는 것이다. 함수 이름과 동일한 식별자에 반환할 값을 대입한 후, `goto` 문을 사용하여 함수의 끝으로 이동하는 방식으로 구현할 수 있다.
```pascal
function FindFirstNegativeElementIndex(a: array of Integer): Integer;
label
100;
var
i: Integer;
begin
for i := Low(a) to High(a) do begin
if a[i] < 0 then begin
FindFirstNegativeElementIndex := i;
goto 100
end
end;
FindFirstNegativeElementIndex := -1;
100:
;
end;
```
그러나 일부 파스칼 버전이나 처리기에서는 특별한 기능을 제공하기도 한다. 예를 들어, `Result`라는 특수한 변수에 반환 값을 할당할 수도 있다. 또한, `Exit` 프로시저를 사용하여 프로시저나 함수의 실행 중간에 빠져나오는 것이 가능하다. 특히, 인수를 받는 확장된 `Exit` 프로시저를 사용하면, 반환 값을 지정하면서 동시에 함수를 빠져나올 수 있다[42]. 이는 C 언어의 `return` 문과 유사한 동작 방식이다.
```pascal
function FindFirstNegativeElementIndex(a: array of Integer): Integer;
var
i: Integer;
begin
for i := Low(a) to High(a) do begin
if a[i] < 0 then begin
Exit(i) // 음수 값을 찾으면 해당 인덱스를 반환하며 함수 종료
end
end;
Exit(-1) // 음수 값을 찾지 못하면 -1을 반환하며 함수 종료
end;
2. 6. COBOL
COBOL에서 RETURN 문은 SORT 문과 관련하여 사용된다. 이 문은 SORT 파일에서 정렬(SORT) 작업 이후의 처리 과정(OUTPUT PROCEDURE)으로 레코드를 반환하는 기능을 수행한다. 후 처리 과정 내에서는 READ 문 대신 RETURN 문이 SORT 파일로부터 레코드를 읽어오는 역할을 한다.[43]2. 7. 기타 언어 (Perl, Ruby, Python, Smalltalk, Windows PowerShell, x86 어셈블리)
펄, 루비, 파이썬은 표현식 지향 프로그래밍 언어의 특징을 일부 공유한다.- '''펄'''과 '''루비''': 명시적인 `return` 문 없이 서브루틴의 마지막으로 평가된 표현식의 값을 반환 값으로 사용할 수 있다.[2] 물론 `return 값;` 또는 `return 값_목록;` 형태의 명시적인 반환문도 사용 가능하다. 값을 지정하지 않은 `return;` 문도 쓸 수 있다.[2]
- 펄에서는 서브루틴이 호출된 문맥(context)에 따라 반환 값의 형태가 달라질 수 있다. 예를 들어, 단일 값을 기대하는 스칼라 문맥, 값의 목록을 기대하는 리스트 문맥, 반환 값을 기대하지 않는 void 문맥 등이 있다. 서브루틴 내에서 `wantarray` 함수를 사용하면 현재 호출된 문맥을 확인할 수 있다.[2] 인자 없이 `return;`만 사용하면 스칼라 문맥에서는 정의되지 않은 값(undef)을, 리스트 문맥에서는 빈 리스트를 반환한다.[2]
- 루비에서 `return`을 생략하면 마지막으로 실행된 구문의 결과가 반환된다.
- '''파이썬''': `return 값` 형태로 값을 반환한다.[2] 만약 함수나 메서드에서 `return` 문이 아예 없거나 `return` 뒤에 값을 명시하지 않으면 특수한 값인 `None`을 반환한다.[2]
- '''스몰토크''': 캐럿(`^`) 기호를 사용하여 값을 반환한다. 예를 들어 `^ 결과값`과 같이 사용한다.
- '''윈도우 파워셸''': `return 값;` 구문을 사용할 수 있지만, 파워셸에서는 명시적인 `return` 문 없이도 함수나 스크립트 내에서 평가된 모든 표현식의 결과 중 다른 곳(변수 할당, 파이프)으로 보내지지 않은(캡처되지 않은) 값들이 자동으로 반환된다. 반환되는 값이 여러 개일 경우 배열 형태로, 하나일 경우 해당 객체 그대로 반환된다.[2]
- '''x86 어셈블리''': `ret` 명령어를 사용하여 현재 서브루틴에서 호출한 곳으로 실행 흐름을 되돌린다. 반환 값 전달에 대한 엄격한 규칙은 없지만, 일반적으로 레지스터 중 하나인 `eax` 레지스터에 반환 값을 넣어 전달하는 것이 관례이다.
3. 다중 return 문
명시적인 `return` 문이 있는 언어에서는 같은 함수 안에서 여러 개의 `return` 문을 사용할 수 있다. 하지만 이것이 좋은 프로그래밍 방식인지에 대해서는 논란이 있다.
구조적 프로그래밍을 중요하게 생각하는 입장에서는 각 함수가 단 하나의 진입점과 단 하나의 종료점(SESE, Single Entry Single Exit)을 가져야 한다고 주장한다. 이런 관점에서는 함수의 가장 마지막 부분에서만 `return` 문을 사용해야 하며, 함수 중간에서 빠져나오는 '조기 반환(early return)'은 GOTO 문처럼 코드의 흐름을 이해하기 어렵게 만들 수 있다고 본다.[14]
반면, 여러 개의 `return` 문을 사용하는 것이 오히려 코드를 더 읽기 쉽게 만든다고 주장하는 입장도 있다. 특히 함수 초반에 특정 조건을 검사하여 빠르게 반환하는 방식은 코드가 깊게 중첩되는 것을 막아줄 수 있다는 것이다. 데이비드 와트는 그의 저서에서 "단일 진입점, 다중 종료점 제어 흐름은 종종 바람직하다"고 언급하며, `return`과 같은 '탈출 시퀀서'는 그 의도가 명확하다고 설명했다. 이는 루프 중간에서 빠져나오는 break 문과 유사한 맥락으로 이해될 수 있다.[15]
실제로 에릭 S. 로버츠가 인용한 연구에 따르면, 파스칼처럼 여러 종료점을 허용하지 않는 언어에서는 학생들이 간단한 문제를 해결하는 데 어려움을 겪는 경우가 있었다. 예를 들어 배열에서 특정 요소를 찾는 함수를 작성할 때, 루프 중간에서 반환하는 것을 허용한 경우 학생들이 더 정확한 코드를 작성하는 경향을 보였다.[16] 켄트 백이나 마틴 파울러와 같은 전문가들도 가드 절(Guard Clause)이라 불리는, 함수 시작 부분에서 조건을 검사해 빠르게 반환하는 패턴이 코드의 가독성을 높이는 데 유용하다고 주장한다.[17][18][19][20]
하지만 함수 중간에서 `return`을 사용하면 주의해야 할 점이 있다. 함수가 끝나기 전에 수행해야 하는 마무리 작업(예: 할당된 메모리 해제, 열린 파일 닫기 등)이 실행되지 않아 메모리 누수나 리소스 누수가 발생할 수 있다. 이런 정리 코드를 모든 `return` 지점 앞에 일일이 넣어주어야 하는데, 이는 실수를 유발하기 쉽고 유지보수를 어렵게 만들 수 있다.
이러한 문제를 해결하기 위해 C++나 파이썬과 같은 언어에서는 특별한 기능을 제공한다. C++의 소멸자(Destructor)나 파이썬의 `try...finally` 구문, `with` 문 등을 사용하면 함수가 어떤 경로로 종료되든(정상적인 `return`이든, 예외 발생이든) 반드시 실행되어야 하는 정리 코드를 자동으로 처리하도록 할 수 있다. 자바나 자바스크립트의 `try...catch...finally` 구조에서 `finally` 블록은 `try`나 `catch` 블록 안에 `return` 문이 있더라도 항상 실행되므로, 리소스 정리 등에 활용될 수 있다.[21]
4. Yield 문
return 문의 사촌 격으로 yield 문이 있다. return 문이 서브루틴을 종료시키는 것과 달리, yield 문은 코루틴을 일시 중단시킨다. 코루틴은 나중에 다시 호출될 경우, 일시 중단되었던 지점부터 실행을 계속한다. 코루틴은 서브루틴보다 구현하기가 더 복잡하기 때문에, yield 문은 return 문보다 덜 흔하게 사용되지만 여러 프로그래밍 언어에서 찾아볼 수 있다.
5. 호출/반환 시퀀스
하드웨어 명령어 집합에 따라 다음과 같은 여러 가지 호출/반환 시퀀스가 가능하다.
# CALL 명령어는 다음 명령어의 주소를 스택에 넣고 지정된 주소로 실행 흐름을 옮긴다. RETURN 명령어는 스택에서 반환 주소를 명령어 포인터로 가져와 해당 주소에서 실행을 다시 시작한다. (예: x86, PDP-11) 모토롤라 96000과 같은 아키텍처에서는 스택 영역이 주 메모리 주소 공간과 구별되는 별도의 '스택 메모리 공간'에 할당될 수 있다.[22] NEC μPD7720 역시 자체 주소 공간을 가진 스택을 특징으로 한다.[24]
# CALL 명령어는 다음 명령어의 주소를 레지스터에 넣고 지정된 주소로 실행 흐름을 옮긴다. RETURN 명령어 시퀀스는 레지스터의 반환 주소를 명령어 포인터에 넣고 해당 주소에서 실행을 다시 시작한다. (예: IBM System/360 및 z/Architecture를 거쳐 대부분의 RISC 아키텍처)
# CALL 명령어는 다음 (또는 현재) 명령어의 주소를 호출 주소의 저장 위치에 넣고 지정된 주소+1로 실행 흐름을 옮긴다. RETURN 명령어 시퀀스는 서브루틴의 첫 번째 명령에 대한 간접 점프를 통해 반환 주소로 실행 흐름을 옮긴다. (예: IBM 1130, SDS 9XX, PDP-8)
참조
[1]
서적
Modula-2 for Pascal Programmers
https://books.google[...]
Springer
[2]
서적
Python in a Nutshell: A Desktop Quick Reference
https://books.google[...]
O'Reilly Media
[3]
서적
Programming Language Pragmatics
https://books.google[...]
Morgan Kaufmann
[4]
서적
Scientific Pascal
https://books.google[...]
Springer
[5]
서적
USA Standard FORTRAN
http://www.fh-jena.d[...]
American National Standards Institute
2010-05-05
[6]
서적
American National Standard – Programming Language FORTRAN
http://www.fortran.c[...]
American National Standards Institute
2007-12-11
[7]
논문
How to best return the value of a function
Association for Computing Machinery
1989-03
[8]
간행물
The Programming Language Oberon
https://people.inf.e[...]
2016-05-03
[9]
웹사이트
return - return from a function or dot script
https://pubs.opengro[...]
[10]
웹사이트
return Statement (C)
https://learn.micros[...]
2023-01-25
[11]
웹사이트
return Statement (C++)
https://learn.micros[...]
2021-08-03
[12]
웹사이트
PHP: return - Manual
http://www.php.net/m[...]
The PHP Group
2013-03-26
[13]
웹사이트
Return - Javascript
https://developer.mo[...]
Mozilla Developer Network
2013-03-27
[14]
웹사이트
C++ Notes: Function return Statement
https://www.fredosau[...]
[15]
서적
Programming Language Design Concepts
John Wiley & Sons
2004
[16]
논문
Loop Exits and Structured Programming: Reopening the Debate
1995-03
[17]
서적
Refactoring: Improving the Design of Existing Code (Google eBook)
https://books.google[...]
Addison-Wesley
2012
[18]
서적
Implementation Patterns
https://books.google[...]
Pearson Education
2007
[19]
웹사이트
Multiple return statements
http://www.javapract[...]
[20]
웹사이트
Return statements and the single exit fantasy
http://www.leepoint.[...]
[21]
웹사이트
The finally Block
http://docs.oracle.c[...]
[22]
웹사이트
DSP96002 32-BIT DIGITAL SIGNAL PROCESSOR USER'S MANUAL
https://www.nxp.com/[...]
2023-12-24
[23]
웹사이트
DSP96002 32-BIT DIGITAL SIGNAL PROCESSOR USER'S MANUAL
https://www.nxp.com/[...]
2023-12-24
[24]
웹사이트
μPD77C20A, 7720A, 77P20 Digital Signal Processor
https://www.datashee[...]
2023-12-25
[25]
문서
ISO/IEC 9899:1999, §6.8.6.4 The return statement, ¶1
[26]
문서
ISO/IEC 14882:1998, §6.6.3 The return statement, ¶2
[27]
문서
ISO/IEC 9899:1999, §6.8.6.4 The return statement, ¶3
[28]
문서
ISO/IEC 14882:1998, §3.6.1 Main function, ¶2
[29]
문서
ISO/IEC 9899:1999, §5.1.2.2.1 Program startup, ¶1
[30]
문서
ISO/IEC 9899:1999, §5.1.2.2.3 Program termination, ¶1
[31]
문서
ISO/IEC 14882:1998, §3.6.1 Main function, ¶5
[32]
문서
ISO/IEC 14882:1998, §6.6.3 The return statement, ¶3
[33]
웹사이트
属性構文 [N2761] - cpprefjp C++日本語リファレンス
https://cpprefjp.git[...]
[34]
웹사이트
_Noreturn function specifier - cppreference.com
https://en.cpprefere[...]
[35]
웹사이트
Chapter 14. Blocks and Statements
https://docs.oracle.[...]
[36]
웹사이트
キーワード リファレンス - F# | Microsoft Learn
https://learn.micros[...]
[37]
웹사이트
Return expressions - The Rust Reference
https://doc.rust-lan[...]
[38]
Github
swift-evolution/proposals/0255-omit-return.md at main · swiftlang/swift-evolution · GitHub
https://github.com/s[...]
[39]
Github
swift-evolution/proposals/0380-if-switch-expressions.md at main · swiftlang/swift-evolution · GitHub
https://github.com/s[...]
[40]
웹사이트
ラムダ式 - ラムダ式と匿名関数 - C# reference | Microsoft Learn
https://learn.micros[...]
[41]
웹사이트
ラムダ式 [N2927] - cpprefjp C++日本語リファレンス
https://cpprefjp.git[...]
[42]
웹사이트
Function results | Free Pascal
https://www.freepasc[...]
[43]
서적
コボルのABC
日本放送出版協会
1970
[44]
웹사이트
in Bash, only integers in the range 0-255 may be returned
http://tldp.org/LDP/[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com